﻿using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ytub_srt
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 获取 richTextBox1 的内容
            string json = richTextBox1.Text.Trim();
            

            // 检查内容是否为空
            if (string.IsNullOrWhiteSpace(json))
            {
                MessageBox.Show("格式错误，请输入 JSON 字符串。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            // 尝试解析 JSON 字符串
            try
            {
                JObject obj = JObject.Parse(json);

                // 检查顶层是否有 events 字段
                if (obj["events"] == null)
                {
                    MessageBox.Show("格式错误，请确保 JSON 字符串包含 events 字段。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                // 解析 events 字段
                var eventsArray = obj["events"].ToArray();
                var subtitleItems = new List<SubtitleItem>();

                foreach (var item in eventsArray)
                {
                    var subtitleItem = new SubtitleItem
                    {
                        tStartMs = (long)item["tStartMs"],
                        dDurationMs = (long)item["dDurationMs"],
                        segs = new Seg[]
                        {
                    new Seg
                    {
                        utf8 = (string)item["segs"][0]["utf8"]
                    }
                        }
                    };

                    subtitleItems.Add(subtitleItem);
                }

                // 将字幕内容转换为 SRT 格式文本
                string srtText = ConvertToSrt(subtitleItems);

                // 保存到文件
                SaveToFile(srtText);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                // 如果解析失败，显示错误消息
                MessageBox.Show("格式错误，请输入符合要求的 JSON 字符串。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

        }

        // FormatTimeSpan 方法用于将 TimeSpan 格式化为 SRT 格式的时间戳
        string FormatTimeSpan(TimeSpan timeSpan)
        {
            return timeSpan.ToString(@"hh\:mm\:ss\,fff");
        }

        // 将字幕内容转换为 SRT 格式文本
        private string ConvertToSrt(List<SubtitleItem> subtitleItems)
        {
            StringBuilder srtContent = new StringBuilder();

            for (int i = 0; i < subtitleItems.Count; i++)
            {
                var item = subtitleItems[i];
                var startTime = TimeSpan.FromMilliseconds(item.tStartMs);
                var endTime = startTime.Add(TimeSpan.FromMilliseconds(item.dDurationMs));

                // 添加字幕序号
                srtContent.AppendLine($"{i + 1}");

                // 添加时间戳
                srtContent.AppendLine($"{FormatTimeSpan(startTime)} --> {FormatTimeSpan(endTime)}");

                // 添加字幕内容
                srtContent.AppendLine(item.segs[0].utf8);

                // 添加空行
                srtContent.AppendLine();
            }

            return srtContent.ToString();
        }

        // 保存到文件
        private void SaveToFile(string content)
        {
            using (var dialog = new SaveFileDialog())
            {
                dialog.Filter = "SRT 字幕文件 (*.srt)|*.srt";
                dialog.Title = "保存 SRT 文件";
                dialog.ShowDialog();

                if (!string.IsNullOrWhiteSpace(dialog.FileName))
                {
                    File.WriteAllText(dialog.FileName, content);
                    MessageBox.Show($"SRT 文件已保存到 {dialog.FileName}", "保存成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "";
        }
    }

    class SubtitleItem
    {
        public long tStartMs { get; set; }
        public long dDurationMs { get; set; }
        public Seg[] segs { get; set; }
    }

    class Seg
    {
        public string utf8 { get; set; }
    }
}
